Client-side load balancing হলো এমন একটি পদ্ধতি, যেখানে ক্লায়েন্ট অ্যাপ্লিকেশন সার্ভিস ইন্সট্যান্সগুলোর তালিকা পায় এবং নিজে থেকেই সার্ভিস ইন্সট্যান্স নির্বাচন করে। Spring Boot-এ Spring Cloud LoadBalancer এবং Ribbon (ডিপ্রিকেটেড) ব্যবহার করে ক্লায়েন্ট-সাইড লোড ব্যালেন্সিং সেটআপ করা যায়।
Spring Cloud LoadBalancer ব্যবহার (প্রস্তাবিত পদ্ধতি)
Spring Cloud LoadBalancer কী?
Spring Cloud LoadBalancer হলো একটি ক্লায়েন্ট-সাইড লোড ব্যালেন্সার, যা API কল করার সময় বিভিন্ন সার্ভিস ইন্সট্যান্সের মধ্যে লোড ভাগাভাগি করে।
Client-Side Load Balancing সেটআপ করার ধাপ
১. ডিপেন্ডেন্সি যোগ করা
Spring Cloud LoadBalancer ব্যবহার করতে, আপনার pom.xml বা build.gradle-এ নিচের ডিপেন্ডেন্সি যোগ করুন:
Maven:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
Gradle:
implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
২. application.yml কনফিগার করা
সার্ভিস ইন্সট্যান্সগুলোর তালিকা কনফিগার করুন। উদাহরণস্বরূপ, যদি আপনার order-service নামে একটি সার্ভিস থাকে:
spring:
cloud:
discovery:
client:
simple:
instances:
order-service:
- uri: http://localhost:8081
- uri: http://localhost:8082
- uri: http://localhost:8083
৩. WebClient-এ Load Balancer ইন্টিগ্রেশন
Spring Cloud LoadBalancer ব্যবহার করতে WebClient-এ সরাসরি ইন্টিগ্রেশন করা যায়।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
public class WebClientConfig {
@Bean
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
৪. API কলের উদাহরণ
Spring Cloud LoadBalancer-কে @LoadBalanced দিয়ে নির্দেশ করতে হয় যে এটি লোড ব্যালেন্সিং করতে হবে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class OrderServiceClient {
private final WebClient.Builder webClientBuilder;
@Autowired
public OrderServiceClient(WebClient.Builder webClientBuilder) {
this.webClientBuilder = webClientBuilder;
}
public String fetchOrderDetails() {
return webClientBuilder.build()
.get()
.uri("http://order-service/orders") // সার্ভিস নাম ব্যবহার করুন
.retrieve()
.bodyToMono(String.class)
.block();
}
}
Ribbon ব্যবহার (ডিপ্রিকেটেড)
১. ডিপেন্ডেন্সি যোগ করা
Ribbon ব্যবহার করতে, নিচের ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
২. application.yml কনফিগার করা
Ribbon সার্ভিস ইন্সট্যান্সের তালিকা থেকে সার্ভিস লোড ব্যালেন্স করবে:
order-service:
ribbon:
listOfServers: localhost:8081,localhost:8082,localhost:8083
৩. RestTemplate ব্যবহার
Ribbon-এ লোড ব্যালেন্সিং করতে @LoadBalanced অ্যানোটেশন ব্যবহার করুন।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
৪. API কলের উদাহরণ
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class OrderServiceClient {
private final RestTemplate restTemplate;
@Autowired
public OrderServiceClient(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public String fetchOrderDetails() {
return restTemplate.getForObject("http://order-service/orders", String.class);
}
}
Custom Load Balancer Strategy
Spring Cloud LoadBalancer-এ আপনি কাস্টম লোড ব্যালেন্সিং স্ট্র্যাটেজি ব্যবহার করতে পারেন।
উদাহরণ: কাস্টম স্ট্র্যাটেজি
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class LoadBalancerConfig {
@Bean
public ReactorServiceInstanceLoadBalancer customLoadBalancer(ServiceInstanceListSupplier supplier) {
return new RandomLoadBalancer(supplier, "order-service"); // Random Load Balancing
}
}
Client-Side Load Balancing ও Discovery Service ইন্টিগ্রেশন
Spring Cloud LoadBalancer ইন্টিগ্রেশন Eureka বা অন্য Discovery সার্ভিসের সাথেও করা যায়।
Eureka Client-সাথে ইন্টিগ্রেশন:
pom.xml-এ ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
উপসংহার
- Spring Cloud LoadBalancer:
আধুনিক Spring Boot অ্যাপ্লিকেশনের জন্য সবচেয়ে উপযুক্ত। - Ribbon (Deprecated):
পূর্বে ব্যবহৃত ক্লায়েন্ট-সাইড লোড ব্যালেন্সার। নতুন প্রকল্পে ব্যবহার না করার পরামর্শ। - Custom Strategy:
বিশেষ ক্ষেত্রে কাস্টম লোড ব্যালান্সিং পদ্ধতি সেটআপ করা সম্ভব।
উপরোক্ত কৌশলগুলো ব্যবহার করে আপনি একটি রিলায়েবল ক্লায়েন্ট-সাইড লোড ব্যালান্সিং মেকানিজম ইমপ্লিমেন্ট করতে পারবেন।